package com.example.mq.mqserver.datacenter;

import com.example.mq.mqserver.core.Binding;
import com.example.mq.mqserver.core.Exchange;
import com.example.mq.mqserver.core.MSGQueue;
import com.example.mq.mqserver.core.Message;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * 封装 硬盘数据的相关操作
 */
public interface IDiskDataCenter {

    /**
     * 初始化
     */
    void init();
    /**
     * 销毁数据库
     */
    void destroyDB();

    /**
     * 在硬盘中插入交换机
     * @param exchange 交换机
     */
    void insertExchange(Exchange exchange);
    /**
     * 在硬盘中删除交换机
     * @param exchange
     */
    void deleteExchange(Exchange exchange);
    /**
     * 获取硬盘上的所有交换机
     * @return 交换机集合
     */
    List<Exchange> selectAllExchange();


    /**
     * 在硬盘上插入队列
     * @param queue 队列
     */
    void insertQueue(MSGQueue queue) throws IOException;
    /**
     * 在硬盘上删除队列
     * @param queue
     */
    void deleteQueue(MSGQueue queue) throws IOException;
    /**
     * 查询硬盘上的所有队列
     * @return 队列集合
     */
    List<MSGQueue> selectAllQueue();


    /**
     * 在硬盘上插入绑定
     * @param binding 绑定
     */
    void insertBinding(Binding binding);
    /**
     * 在硬盘上删除绑定
     * @param binding
     */
    void deleteBinding(Binding binding);
    /**
     * 获取硬盘上的所有绑定
     * @return 绑定集合
     */
    List<Binding> selectAllBinding();


    /**
     * 发送消息;将消息持久化到文件
     * @param queue 队列
     * @param message 消息体
     */
    void sendMessage(MSGQueue queue, Message message) throws IOException;
    /**
     * 删除消息；把消息从文件中删除（逻辑删除）
     * @param queue 队列
     * @param message 消息体
     */
    void deleteMessage(MSGQueue queue,Message message) throws IOException, ClassNotFoundException;
    /**
     * 从队列中获取所有消息
     * @param queueName 队列名
     * @return 消息集合
     */
    LinkedList<Message> loadAllMessageFromQueue(String queueName) throws IOException, ClassNotFoundException;

}
